package com.smart.community.feign.user.fallback;

import java.util.Collections;
import java.util.List;

import org.springframework.stereotype.Component;

import com.smart.community.feign.common.BaseFeignFallbackFactory;
import com.smart.community.feign.user.dto.RoleDTO;
import com.smart.community.feign.user.dto.UserDTO;
import com.smart.community.feign.user.dto.NormalUserCreateDTO;
import com.smart.community.feign.user.service.UserFeignService;

import lombok.extern.slf4j.Slf4j;

/**
 * 用户服务Feign接口降级处理工厂
 * 
 * 当用户服务不可用时，提供降级处理：
 * 1. 返回安全的默认值，避免调用方异常
 * 2. 记录详细的错误日志，便于问题排查
 * 3. 确保系统稳定性，避免级联故障
 * 
 * @author Wu.Liang
 * @version 2.0.0
 * @since 2025-01-21
 * @updated 2025-08-28 - 继承BaseFeignFallbackFactory，使用统一的降级处理标准
 */
@Slf4j
@Component
public class UserFeignFallbackFactory extends BaseFeignFallbackFactory<UserFeignService> {
    
    @Override
    public UserFeignService create(Throwable cause) {
        // 使用基类的统一日志记录方法，区分异常类型
        if (isServiceUnavailable(cause)) {
            logServiceUnavailable(getServiceName(), cause);
        } else {
            log.warn("{}服务调用异常，执行降级处理: {}", getServiceName(), cause.getMessage());
        }
        
        return new UserFeignService() {
            
            @Override
            public UserDTO getUserById(Long userId) {
                logMethodFallback("getUserById", userId);
                return null; // 返回null，表示未找到
            }
            
            @Override
            public UserDTO getUserByUsername(String username) {
                logMethodFallback("getUserByUsername", username);
                return null; // 返回null，表示未找到
            }
            
            @Override
            public UserDTO getUserByIdCard(String idCard) {
                logMethodFallback("getUserByIdCard", idCard);
                return null; // 返回null，表示未找到
            }
            
            @Override
            public UserDTO getUserByPhone(String phone) {
                logMethodFallback("getUserByPhone", phone);
                return null; // 返回null，表示未找到
            }
            
            @Override
            public UserDTO createUser(UserDTO userDTO) {
                logMethodFallback("createUser", userDTO);
                return null; // 返回null，表示创建失败
            }
            
            @Override
            public Long createNormalUser(NormalUserCreateDTO dto) {
                logMethodFallback("createNormalUser", dto);
                return null; // 返回null，表示创建失败
            }
            
            @Override
            public Boolean updateUser(UserDTO userDTO) {
                logMethodFallback("updateUser", userDTO);
                return false; // 返回false，表示更新失败
            }
            
            @Override
            public Boolean updateUserType(Long userId, String userType) {
                logMethodFallback("updateUserType", userId, userType);
                return false; // 返回false，表示更新失败
            }
            
            @Override
            public Boolean validatePassword(UserDTO userDTO) {
                logMethodFallback("validatePassword", userDTO);
                return false; // 返回false，表示验证失败
            }
            
            @Override
            public Boolean deleteUser(Long userId) {
                logMethodFallback("deleteUser", userId);
                return false; // 返回false，表示删除失败
            }
            
            @Override
            public List<UserDTO> getUsersByIds(List<Long> userIds) {
                logMethodFallback("getUsersByIds", userIds);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<UserDTO> getUsersByRole(String roleCode) {
                logMethodFallback("getUsersByRole", roleCode);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<UserDTO> getUsersByCommunity(Long communityId) {
                logMethodFallback("getUsersByCommunity", communityId);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<UserDTO> getUsersByPropertyCompany(Long propertyCompanyId) {
                logMethodFallback("getUsersByPropertyCompany", propertyCompanyId);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }
            
            @Override
            public Boolean checkUsernameExists(String username) {
                logMethodFallback("checkUsernameExists", username);
                return false; // 返回false，表示不存在，允许创建
            }
            
            @Override
            public Boolean checkPhoneExists(String phone) {
                logMethodFallback("checkPhoneExists", phone);
                return false; // 返回false，表示不存在，允许创建
            }
            
            @Override
            public Boolean checkEmailExists(String email) {
                logMethodFallback("checkEmailExists", email);
                return false; // 返回false，表示不存在，允许创建
            }

            @Override
            public Void assignUserRoles(Long userId, List<Long> roleIds) {
                logMethodFallback("assignUserRoles", userId, roleIds);
                return null; // 返回null，表示分配失败
            }

            @Override
            public List<RoleDTO> getUserRoles(Long userId) {
                logMethodFallback("getUserRoles", userId);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }

            @Override
            public Long getRoleIdByCode(String roleCode) {
                logMethodFallback("getRoleIdByCode", roleCode);
                return null; // 返回null，表示未找到角色
            }
        };
    }
    
    @Override
    protected String getServiceName() {
        return "用户服务";
    }
} 